package edu.ccut.saturn.component.impl.mock;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class MockRequest implements HttpServletRequest {
	
	@SuppressWarnings("unchecked")
	private Map<String, Object> attributeMap = new HashMap<String, Object>();

	private Map<String, Object> parameterMap = new HashMap<String, Object>();
	
	private MockSession session = new MockSession();
	
	public MockRequest() {
		
	}
	
	@SuppressWarnings("unchecked")
	public MockRequest(HttpServletRequest request) {
		Enumeration<String> requestEnumeration = request.getParameterNames();
		while (requestEnumeration.hasMoreElements()) {
			String key = requestEnumeration.nextElement();
			this.parameterMap.put(key, request.getParameter(key));
		}
		
		
		Enumeration<String> enumeration = request.getAttributeNames();
		while (enumeration.hasMoreElements()) {
			String key = enumeration.nextElement();
			this.attributeMap.put(key, request.getAttribute(key));
		}
		
		session = new MockSession(request.getSession());
	}
	
	public Object getAttribute(String key) {
		return attributeMap.get(key);
	}

	@SuppressWarnings("unchecked")
	public Enumeration<String> getAttributeNames() {
		return new MockEnumeration(this.attributeMap);
	}

	public String getAuthType() {
		return null;
	}

	public String getCharacterEncoding() {
		return null;
	}

	public int getContentLength() {
		return 0;
	}

	public String getContentType() {
		return null;
	}

	public String getContextPath() {
		return null;
	}

	public Cookie[] getCookies() {
		return null;
	}

	public long getDateHeader(String string) {
		return 0;
	}

	public String getHeader(String string) {
		return null;
	}

	public Enumeration<String> getHeaderNames() {
		return null;
	}

	public Enumeration<String> getHeaders(String string) {
		return null;
	}

	public ServletInputStream getInputStream() throws IOException {
		return null;
	}

	public int getIntHeader(String string) {
		return 0;
	}

	public String getLocalAddr() {
		return null;
	}

	public Locale getLocale() {
		return null;
	}

	public Enumeration<Locale> getLocales() {
		return null;
	}

	public String getLocalName() {
		return null;
	}

	public int getLocalPort() {
		return 0;
	}

	public String getMethod() {
		return null;
	}

	public String getParameter(String string) {
		Object value = this.parameterMap.get(string);
		
		if (value instanceof String) {
			return (String)value;
		} else if (value instanceof Object[]) {
			return Arrays.toString((Object[])value);
		} else {
			return value.toString();
		}
	}

	@SuppressWarnings("unchecked")
	public Map<String, ?> getParameterMap() {
		return this.parameterMap;
	}

	@SuppressWarnings("unchecked")
	public Enumeration<String> getParameterNames() {
		return new MockEnumeration(this.parameterMap);
	}

	public String[] getParameterValues(String string) {
		
	    if(this.parameterMap.get(string) != null) {
		    return new String[] { this.parameterMap.get(string).toString() };
		}	 
	    
		return null;
	}

	public String getPathInfo() {
		return null;
	}

	public String getPathTranslated() {
		return null;
	}

	public String getProtocol() {
		return null;
	}

	public String getQueryString() {
		return null;
	}

	public Object getRealHttpServletRequest() {
		return null;
	}

	public String getRemoteAddr() {
		return null;
	}

	public String getRemoteHost() {
		return null;
	}

	public int getRemotePort() {
		return 0;
	}

	public String getRemoteUser() {
		return null;
	}

	public RequestDispatcher getRequestDispatcher(String string) {
		return null;
	}

	public String getRequestedSessionId() {
		return null;
	}

	public String getRequestURI() {
		return null;
	}

	public StringBuffer getRequestURL() {
		return null;
	}

	public String getScheme() {
		return null;
	}

	public String getServerName() {
		return null;
	}

	public int getServerPort() {
		return 0;
	}

	public String getServletPath() {
		return null;
	}

	public HttpSession getSession() {
		return this.session;
	}

	public HttpSession getSession(boolean b) {
		return null;
	}

	public Principal getUserPrincipal() {
		return null;
	}

	public boolean isRequestedSessionIdFromCookie() {
		return false;
	}

	public boolean isRequestedSessionIdFromURL() {
		return false;
	}

	public boolean isRequestedSessionIdValid() {
		return false;
	}

	public boolean isSecure() {
		return false;
	}

	public boolean isUserInRole(String string) {
		return false;
	}

	public void removeAttribute(String string) {
	}

	@SuppressWarnings("unchecked")
	public void setAttribute(String string, Object object) {
		this.attributeMap.put(string, object);
	}

	public void setCharacterEncoding(String string)
			throws UnsupportedEncodingException {
	}

	public boolean isRequestedSessionIdFromUrl() {
		return false;
	}

	public BufferedReader getReader() throws IOException {
		return null;
	}

	public String getRealPath(String path) {
		return null;
	}
}
